home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / PIL / GifImagePlugin.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  8KB  |  296 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __version__ = '0.9'
  5. import Image
  6. import ImageFile
  7. import ImagePalette
  8.  
  9. def i16(c):
  10.     return ord(c[0]) + (ord(c[1]) << 8)
  11.  
  12.  
  13. def o16(i):
  14.     return chr(i & 255) + chr(i >> 8 & 255)
  15.  
  16.  
  17. def _accept(prefix):
  18.     return prefix[:6] in ('GIF87a', 'GIF89a')
  19.  
  20.  
  21. class GifImageFile(ImageFile.ImageFile):
  22.     format = 'GIF'
  23.     format_description = 'Compuserve GIF'
  24.     global_palette = None
  25.     
  26.     def data(self):
  27.         s = self.fp.read(1)
  28.         if s and ord(s):
  29.             return self.fp.read(ord(s))
  30.         
  31.  
  32.     
  33.     def _open(self):
  34.         s = self.fp.read(13)
  35.         if s[:6] not in ('GIF87a', 'GIF89a'):
  36.             raise SyntaxError, 'not a GIF file'
  37.         
  38.         self.info['version'] = s[:6]
  39.         self.size = (i16(s[6:]), i16(s[8:]))
  40.         self.tile = []
  41.         flags = ord(s[10])
  42.         bits = (flags & 7) + 1
  43.         if flags & 128:
  44.             self.info['background'] = ord(s[11])
  45.             p = self.fp.read(3 << bits)
  46.             for i in range(0, len(p), 3):
  47.                 if p[i] == p[i] and p[i + 1] == p[i + 1]:
  48.                     pass
  49.                 elif not p[i + 1] == p[i + 2]:
  50.                     p = ImagePalette.raw('RGB', p)
  51.                     self.global_palette = self.palette = p
  52.                     break
  53.                     continue
  54.             
  55.         
  56.         self._GifImageFile__fp = self.fp
  57.         self._GifImageFile__rewind = self.fp.tell()
  58.         self.seek(0)
  59.  
  60.     
  61.     def seek(self, frame):
  62.         if frame == 0:
  63.             self._GifImageFile__offset = 0
  64.             self.dispose = None
  65.             self._GifImageFile__frame = -1
  66.             self._GifImageFile__fp.seek(self._GifImageFile__rewind)
  67.         
  68.         if frame != self._GifImageFile__frame + 1:
  69.             raise ValueError, 'cannot seek to frame %d' % frame
  70.         
  71.         self._GifImageFile__frame = frame
  72.         self.tile = []
  73.         self.fp = self._GifImageFile__fp
  74.         if self._GifImageFile__offset:
  75.             self.fp.seek(self._GifImageFile__offset)
  76.             while self.data():
  77.                 pass
  78.             self._GifImageFile__offset = 0
  79.         
  80.         if self.dispose:
  81.             self.im = self.dispose
  82.             self.dispose = None
  83.         
  84.         self.palette = self.global_palette
  85.         while None:
  86.             s = self.fp.read(1)
  87.             if not s or s == ';':
  88.                 break
  89.                 continue
  90.             if s == '!':
  91.                 s = self.fp.read(1)
  92.                 block = self.data()
  93.                 if ord(s) == 249:
  94.                     flags = ord(block[0])
  95.                     if flags & 1:
  96.                         self.info['transparency'] = ord(block[3])
  97.                     
  98.                     self.info['duration'] = i16(block[1:3]) * 10
  99.                     
  100.                     try:
  101.                         if flags & 8:
  102.                             self.dispose = Image.core.fill('P', self.size, self.info['background'])
  103.                         elif flags & 16:
  104.                             self.dispose = self.im.copy()
  105.                     except (AttributeError, KeyError):
  106.                         pass
  107.                     except:
  108.                         None<EXCEPTION MATCH>(AttributeError, KeyError)
  109.                     
  110.  
  111.                 None<EXCEPTION MATCH>(AttributeError, KeyError)
  112.                 if ord(s) == 255:
  113.                     self.info['extension'] = (block, self.fp.tell())
  114.                     if block[:11] == 'NETSCAPE2.0':
  115.                         self.info['loop'] = 1
  116.                     
  117.                 
  118.                 while self.data():
  119.                     pass
  120.                 continue
  121.             if s == ',':
  122.                 s = self.fp.read(9)
  123.                 x0 = i16(s[0:])
  124.                 y0 = i16(s[2:])
  125.                 x1 = x0 + i16(s[4:])
  126.                 y1 = y0 + i16(s[6:])
  127.                 flags = ord(s[8])
  128.                 interlace = flags & 64 != 0
  129.                 if flags & 128:
  130.                     bits = (flags & 7) + 1
  131.                     self.palette = ImagePalette.raw('RGB', self.fp.read(3 << bits))
  132.                 
  133.                 bits = ord(self.fp.read(1))
  134.                 self._GifImageFile__offset = self.fp.tell()
  135.                 self.tile = [
  136.                     ('gif', (x0, y0, x1, y1), self._GifImageFile__offset, (bits, interlace))]
  137.                 break
  138.                 continue
  139.             continue
  140.             if not self.tile:
  141.                 raise EOFError, 'no more images in GIF file'
  142.             
  143.         self.mode = 'L'
  144.         if self.palette:
  145.             self.mode = 'P'
  146.         
  147.  
  148.     
  149.     def tell(self):
  150.         return self._GifImageFile__frame
  151.  
  152.  
  153.  
  154. try:
  155.     import _imaging_gif
  156. except ImportError:
  157.     _imaging_gif = None
  158.  
  159. RAWMODE = {
  160.     '1': 'L',
  161.     'L': 'L',
  162.     'P': 'P' }
  163.  
  164. def _save(im, fp, filename):
  165.     if _imaging_gif:
  166.         
  167.         try:
  168.             _imaging_gif.save(im, fp, filename)
  169.             return None
  170.         except IOError:
  171.             pass
  172.         except:
  173.             None<EXCEPTION MATCH>IOError
  174.         
  175.  
  176.     None<EXCEPTION MATCH>IOError
  177.     
  178.     try:
  179.         rawmode = RAWMODE[im.mode]
  180.         imOut = im
  181.     except KeyError:
  182.         if Image.getmodebase(im.mode) == 'RGB':
  183.             imOut = im.convert('P')
  184.             rawmode = 'P'
  185.         else:
  186.             imOut = im.convert('L')
  187.             rawmode = 'L'
  188.     except:
  189.         Image.getmodebase(im.mode) == 'RGB'
  190.  
  191.     for s in getheader(imOut, im.encoderinfo):
  192.         fp.write(s)
  193.     
  194.     flags = 0
  195.     
  196.     try:
  197.         interlace = im.encoderinfo['interlace']
  198.     except KeyError:
  199.         interlace = 1
  200.  
  201.     if min(im.size) < 16:
  202.         interlace = 0
  203.     
  204.     if interlace:
  205.         flags = flags | 64
  206.     
  207.     
  208.     try:
  209.         transparency = im.encoderinfo['transparency']
  210.     except KeyError:
  211.         pass
  212.  
  213.     fp.write('!' + chr(249) + chr(4) + chr(1) + o16(0) + chr(int(transparency)) + chr(0))
  214.     fp.write(',' + o16(0) + o16(0) + o16(im.size[0]) + o16(im.size[1]) + chr(flags) + chr(8))
  215.     imOut.encoderconfig = (8, interlace)
  216.     ImageFile._save(imOut, fp, [
  217.         ('gif', (0, 0) + im.size, 0, rawmode)])
  218.     fp.write('\x00')
  219.     fp.write(';')
  220.     
  221.     try:
  222.         fp.flush()
  223.     except:
  224.         pass
  225.  
  226.  
  227.  
  228. def _save_netpbm(im, fp, filename):
  229.     import os as os
  230.     file = im._dump()
  231.     if im.mode != 'RGB':
  232.         os.system('ppmtogif %s >%s' % (file, filename))
  233.     else:
  234.         os.system('ppmquant 256 %s | ppmtogif >%s' % (file, filename))
  235.     
  236.     try:
  237.         os.unlink(file)
  238.     except:
  239.         pass
  240.  
  241.  
  242.  
  243. def getheader(im, info = None):
  244.     if info:
  245.         pass
  246.     optimize = info.get('optimize', 0)
  247.     s = [
  248.         'GIF87a' + o16(im.size[0]) + o16(im.size[1]) + chr(135) + chr(0) + chr(0)]
  249.     if optimize:
  250.         i = 0
  251.         maxcolor = 0
  252.         for count in im.histogram():
  253.             if count:
  254.                 maxcolor = i
  255.             
  256.             i = i + 1
  257.         
  258.     else:
  259.         maxcolor = 256
  260.     if im.mode == 'P':
  261.         s.append(im.im.getpalette('RGB')[:maxcolor * 3])
  262.     else:
  263.         for i in range(maxcolor):
  264.             s.append(chr(i) * 3)
  265.         
  266.     return s
  267.  
  268.  
  269. def getdata(im, offset = (0, 0), **params):
  270.     
  271.     class collector:
  272.         data = []
  273.         
  274.         def write(self, data):
  275.             self.data.append(data)
  276.  
  277.  
  278.     im.load()
  279.     fp = collector()
  280.     
  281.     try:
  282.         im.encoderinfo = params
  283.         fp.write(',' + o16(offset[0]) + o16(offset[1]) + o16(im.size[0]) + o16(im.size[1]) + chr(0) + chr(8))
  284.         ImageFile._save(im, fp, [
  285.             ('gif', (0, 0) + im.size, 0, RAWMODE[im.mode])])
  286.         fp.write('\x00')
  287.     finally:
  288.         del im.encoderinfo
  289.  
  290.     return fp.data
  291.  
  292. Image.register_open(GifImageFile.format, GifImageFile, _accept)
  293. Image.register_save(GifImageFile.format, _save)
  294. Image.register_extension(GifImageFile.format, '.gif')
  295. Image.register_mime(GifImageFile.format, 'image/gif')
  296.